package cn.iocoder.yudao.module.measure.dal.dataobject.upload;

import cn.iocoder.yudao.module.measure.dal.dataobject.protocol.DataContentValue;
import lombok.Data;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;

@Data
public class MeasureData {

    private Map<String,List<BusinessDeviceUploadData>> data; // 明细数据 echarts使用 Map<typeName,List<BusinessDeviceUploadData>>
    private List<DataContentValue> valueList; //极值数据列表 table使用
    // 查询参数
    private List<String> queryDataContentType;
    private LocalDateTime queryDateBegin;
    private LocalDateTime queryDateEnd;
    private Long queryMeasurePointId;

    // 计算过程中数据
    private Map<String,DataContentValue> calcDataTemp;

    public void add(BusinessDeviceUploadData uploadData) {
        if(data==null){
            data=new HashMap<>();
        }
        // JAVA 8 以上专有 从map中取指定key的值 通过函数计算新值并插入Map，若键存在则直接返回当前值
        List<BusinessDeviceUploadData> list = data.computeIfAbsent(uploadData.getDataType(), k -> new ArrayList<>());
        // 添加明细记录
        list.add(uploadData);
        if(calcDataTemp == null){
            calcDataTemp = new HashMap<>();
        }
        DataContentValue calcData = calcDataTemp.get(uploadData.getDataType());
        if(calcData==null){
            calcDataTemp.put(uploadData.getDataType(), new DataContentValue(uploadData));
        }else{
            // 检查并更新特殊值记录
            calcData.updateSpicValue(uploadData);
        }

    }


    public void covertToFinish(Map<String, String> contentMap) {
        List<DataContentValue> finalList = new ArrayList<>();
        Map<String,List<BusinessDeviceUploadData>> finalData = new HashMap<>();
        if(calcDataTemp!=null){
            Set<Map.Entry<String, DataContentValue>> set = calcDataTemp.entrySet();
            Iterator<Map.Entry<String, DataContentValue>> itr = set.iterator();
            while (itr.hasNext()) {
                Map.Entry<String, DataContentValue> entry = itr.next();
                DataContentValue value = entry.getValue();
                // 转码
                String contentType = value.getDataContentType();
                String contentTypeName = contentMap.get(contentType);
                value.setDataContentTypeName(contentTypeName);
                List<BusinessDeviceUploadData> list = data.get(contentType);
                finalData.put(contentTypeName,list);
                // 因为极值列表与明细数据列表中数据类型保持一一对应 故按照极值列表的key取一遍后 明细数据表的数据就会被全部遍历到 所以不需要检查是否数据已经被全部处理了

                // 计算均值
                BigDecimal sum = BigDecimal.valueOf(value.getSumValue());
                if(list==null){
                    value.setAvgValue(0);
                }else{
                    BigDecimal count = BigDecimal.valueOf(list.size());
                    BigDecimal avg = sum.divide(count, 2, RoundingMode.HALF_UP);
                    value.setAvgValue(avg.doubleValue());
                }
                finalList.add(value);
            }
        }

        valueList = finalList;
        data = finalData;
    }
}
